package com.pig4cloud.pigx.common.customize.api.config;

import lombok.Data;
import org.springframework.web.servlet.mvc.condition.RequestCondition;

import javax.servlet.http.HttpServletRequest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 开放api接口请求匹配条件
 *
 * @since 2022/10/27 10:31
 */
@Data
public class ApiVersionCondition implements RequestCondition<ApiVersionCondition> {
	/**
	 * 匹配类似 v1.0/ 的路径
	 */
	private static final Pattern VERSION_PREFIX_PATTERN = Pattern.compile("v(\\d+(\\.\\d+)?)/");
	/**
	 * 开放版本版本号
	 */
	private String apiVersion;

	public ApiVersionCondition(String apiVersion) {
		this.apiVersion = apiVersion;
	}

	/**
	 * 和另外一个请求匹配条件合并，具体合并逻辑由实现类提供
	 *
	 * @param other 另外一个请求匹配条件
	 * @return {@link ApiVersionCondition}
	 * @since 2022/10/27 10:34
	 */
	@Override
	public ApiVersionCondition combine(ApiVersionCondition other) {
		// 使用方法上的设置覆盖类上的设置
		return new ApiVersionCondition(other.getApiVersion());
	}

	/**
	 * 检查当前请求匹配条件和指定请求request是否匹配，如果不匹配返回null，
	 *
	 * @param request 请求体
	 * @return {@link ApiVersionCondition}
	 * @since 2022/10/27 10:38
	 */
	@Override
	public ApiVersionCondition getMatchingCondition(HttpServletRequest request) {
		// 获取版本号
		Matcher matcher = VERSION_PREFIX_PATTERN.matcher(request.getRequestURI());
		System.err.println(request.getRequestURI());

		if (matcher.find()) {
			String version = matcher.group(1);

			// 版本号大于等于类/方法上指定的版本号
			if (version.compareTo(this.apiVersion) >= 0) {
				return this;
			}
		}

		// 不匹配
		return null;
	}

	/**
	 * 拥有多个匹配的控制器时，通过比较优先级来决定最终采用哪一个
	 *
	 * @param other   其它
	 * @param request 请求
	 * @return {@link String}
	 * @since 2022/10/27 10:59
	 */
	@Override
	public int compareTo(ApiVersionCondition other, HttpServletRequest request) {
		// 优先使用最新版本
		return other.getApiVersion().compareTo(this.apiVersion);
	}
}
